/**
 * @file app_sys.c
 * @brief 包含应用系统相关的函数
 *
 * 本文件定义了一些用于处理数据类型转换的实用函数，包括将
 * 32 位无符号整数转换为 8 位无符号整数数组的函数。
 *
 * @note 
 */

#include "app_main.h"
#include "app_sys.h"
#include "main.h"
#include "usart.h"
#include "string.h"
#include "drv_pwm.h"
#include "drv_usart.h"
#include "drv_adc.h"
#include "app_config.h"
#include "app_pwr.h"
#include "app_led.h"
#include "sys_manager.h"
#include "app_misc.h"
#include "app_midi.h"  // 新增这行

//定时器分配，tim1，系统，tim2，逻辑判断，tim3，pwm

extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2;
static uint16_t TIM_heartbeat_count = 0;
static uint16_t TIM_adc_count = 0;
static uint8_t heartbeat = 0xFE;

system_timer_t sys_timer = {0};

#if (APP_ENABLE_AUTO_POWER_DWON == 1)
#ifndef APP_AUTO_POWER_DWON_TIM_COUNT_10MS
#define APP_AUTO_POWER_DWON_TIM_COUNT_10MS 60000
#endif
uint32_t TIM_auto_power_down_count = 0;
uint16_t TIM_low_voltage_report_count = 0;
#endif

/* ------------------------------- 延时部分 ------------------------------- */

// 延时函数，以微秒为单位
void delay_us(uint32_t us)
{  
    uint16_t diff = 0xffff - us - 5;
    HAL_TIM_Base_Start(&htim1);
    __HAL_TIM_SET_COUNTER(&htim1, diff);
    while (diff<0xFFFF-5)
    {
        diff = __HAL_TIM_GET_COUNTER(&htim1); 
    }
    HAL_TIM_Base_Stop(&htim1);
}


// 毫秒延时函数
void delay_ms(uint32_t ms)
{
    for (uint32_t i = 0; i < ms; i++)
    {
        delay_us(999); // 每次延时 1 毫秒
    }
}

//系统任务处理，必须在main循环中调用
// void sys_task_scheduler()
// {
//     /* 心跳包发送 */
//     if(sys_timer.heartbeat_flag) 
//     {
//         sys_timer.heartbeat_flag = 0;
//         drv_usart_send_data(USART3_PORT, (uint8_t*)&heartbeat, 1);
//     }

//     /* ADC数据更新 */
//     if(sys_timer.adc_update_flag) 
//     {
//         sys_timer.adc_update_flag = 0;
//         drv_adc_tim_handle();
//     }
// }

uint32_t sys_get_tick(void)
{
    return sys_timer.sys_tick;
}

#include "app_key.h"
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)  
    { 
        /* 基础时间维护 */
        sys_timer.sys_tick++;  // 替代HAL_GetTick()
        
        if(sys_timer.dec_counter++ >= TIM_BASE_UNIT_10MS)
        {
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
            sys_timer.dec_counter = 0;

            if(TIM_heartbeat_count++ >= TIM_UART_HEART_BEAT_TH_10MS)
            {
                TIM_heartbeat_count = 0;
                sys_timer.heartbeat_flag = 1;
                drv_usart_send_data(USART3_PORT, (uint8_t*)&heartbeat, 1);

                if(system_status.error)
                {
                    if(!system_status.uart.uart1_error &&
                       !system_status.uart.uart2_error &&
                       !system_status.uart.uart3_error &&
                       !system_status.uart.uart1_error_code &&
                       !system_status.uart.uart2_error_code &&
                       !system_status.uart.uart3_error_code)
                    {
                        system_status.error = 0;
                    }
                }
            }

            if(pwr_state == PWR_ON)
            {
                if(TIM_adc_count++ >= TIM_ADC_UPDATE_TH_10MS)
                {
                    TIM_adc_count = 0;
                    sys_timer.adc_update_flag = 1;
                    drv_adc_tim_handle();
                }
#if (APP_ENABLE_AUTO_POWER_DWON == 1)
                if(TIM_auto_power_down_count ++ >= APP_AUTO_POWER_DWON_TIM_COUNT_10MS)
                {
                    TIM_auto_power_down_count = 0;
                    if(is_power_on())
                    {
                        app_power_off();
                    }
                }
#endif
            }

#if (APP_ENABLE_AUTO_POWER_DWON == 1)
            if(system_status.power.low_voltage && system_status.power.wait_report)
            {
                if(TIM_low_voltage_report_count ++ >= TIM_LOW_VOLTAGE_REPORT_COUNT_10MS)
                {
                    TIM_low_voltage_report_count = 0;
                    system_status.power.wait_report = 0;

                    char* msg = "Low Voltage";
                    app_sync_data(SRC_UART1, (uint8_t*)msg, strlen(msg));
                }
            }
#endif

#if (APP_FEATURE_LED_ERROR_BLINK == 1)  
            app_led_task_10ms();
#endif  
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);

            // MIDI通信超时检测
            if(system_status.is_communicating) {
                system_status.midi_comm_timer = 0;
            } else {
                if(system_status.midi_comm_timer < MIDI_COMM_TIMEOUT_10MS) {  // 3秒 = 300 * 10ms
                    system_status.midi_comm_timer++;
                    if(system_status.midi_comm_timer == MIDI_COMM_TIMEOUT_10MS && is_power_on()) 
                    {
                        if(work_flag == WORK_PWR_ON) 
                        {
                            app_taban_stop_all();  // 只关闭踏板
                        }
                    }
                }
            }
            system_status.is_communicating = 0;  // 每10ms周期自动清零

        }

        if (system_status.user.buzzer_timer > 0)
        {
            system_status.user.buzzer_timer--;
            if (system_status.user.buzzer_timer == 0)
            {
                if (system_status.user.buzzer_state == 1)
                {
                    app_buzzer_stop();         // 关闭蜂鸣器
                    system_status.user.buzzer_state = 0;
                }
            }
        }

        app_key_timeout();

    }
    else if (htim->Instance == TIM3)
    {
        drv_pwm_interrupt_handle();
    }  
} 


void app_sys_init(void)
{
    HAL_TIM_Base_Start_IT(&htim2);
}

